<?php

declare(strict_types=1);

namespace App\Validations;

/**
 * Clase base para todas las reglas de validación.
 */
abstract class BaseValidation
{
    private const REQUIRED_RULE = 'required';

    /**
     * Método abstracto dependiente que obtiene todas las reglas de validación.
     */
    abstract public function getAllRules(): array;

    /**
     * Método abstracto dependiente que obtiene todos los filtros de validación.
     */
    abstract public function getAllFilters(): array;

    /**
     * Convierte un string de campos a un array.
     */
    private function explode(string $fields): array
    {
        return explode(', ', trim($fields));
    }

    /**
     * Obtiene reglas de validación.
     */
    public function getRules(string|array $fields, bool $required = false): array
    {
        $result = [];
        $rules = $this->getAllRules();

        if (is_string($fields)) {
            $fields = $this->explode($fields);
        }

        foreach ($fields as $field) {
            if (isset($rules[$field])) {
                $result[$field] = $rules[$field];

                // Establece el campo como obligatorio.
                $required && array_unshift($result[$field], self::REQUIRED_RULE);
            }
        }

        return $result;
    }

    /**
     * Obtiene filtros de validación.
     */
    public function getFilters(string|array $fields): array
    {
        $result = [];
        $filters = $this->getAllFilters();

        if (is_string($fields)) {
            $fields = $this->explode($fields);
        }

        foreach ($fields as $field) {
            if (isset($filters[$field])) {
                $result[$field] = $filters[$field];
            }
        }

        return $result;
    }
}
